﻿using DotNetNuke.UI.Skins.Controls;
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
//
// DotNetNuke - http://www.dotnetnuke.com
// Copyright (c) 2002-2010
// by DotNetNuke Corporation
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions 
// of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//

using WebFormsMvp.Web;
using DotNetNuke.UI.Modules;
using System.Globalization;
using WebFormsMvp;
using DotNetNuke.Services.Localization;

namespace DotNetNuke.Web.Mvp
{
	public abstract class ModuleViewBase : ModuleUserControlBase, IModuleViewBase
	{

		#region "Private Members"

			#endregion
		private bool _AutoDataBind;

		#region "Constructors"

		protected ModuleViewBase()
		{
			AutoDataBind = true;
		}

		#endregion

		#region "Public Properties"

		public bool AutoDataBind {
			get { return _AutoDataBind; }
			set { _AutoDataBind = value; }
		}

		#endregion

		#region "Protected Methods"

		protected T DataItem<T>() where T : class, new()
		{
			T _T = Page.GetDataItem() as T;
			if (_T == null) {
				_T = new T();
			}
			return _T;
		}

		protected T DataValue<T>()
		{
			return (T)Page.GetDataItem();
		}

		protected string DataValue<T>(string format)
		{
			return string.Format(CultureInfo.CurrentCulture, format, DataValue<T>());
		}



		protected override void OnInit(System.EventArgs e)
		{
			PageViewHost.Register(this, Context, false);

			base.OnInit(e);

			Page.InitComplete += Page_InitComplete;
			Page.PreRenderComplete += Page_PreRenderComplete;
			Page.Load += Page_Load;
		}


		#endregion

		#region "IModuleView(Of TModel) Implementation"

		public event EventHandler Initialize;

		public void ProcessModuleLoadException(Exception ex)
		{
			DotNetNuke.Services.Exceptions.Exceptions.ProcessModuleLoadException(this, ex);
		}

		public void ShowMessage(string messageHeader, string message, ModuleMessage.ModuleMessageType messageType)
		{
			DotNetNuke.UI.Skins.Skin.AddModuleMessage(this, messageHeader, message, messageType);
		}

		#endregion

		#region "IView(Of TModel) Implementation"

		public event EventHandler Load;


		#endregion

		#region "Event Handlers"

		private void Page_InitComplete(object sender, System.EventArgs e)
		{
			//Raise Initialize Event to run any initialization code
			if (Initialize != null) {
				Initialize(this, EventArgs.Empty);
			}
		}

		private void Page_Load(object sender, System.EventArgs e)
		{
			if (Load != null) {
				Load(this, e);
			}
		}

		private void Page_PreRenderComplete(object sender, EventArgs e)
		{
			//This event is raised after any async page tasks have completed, so it
			//is safe to data-bind
			if ((AutoDataBind))
				DataBind();
		}

		#endregion

	}
}
